abcjs ピックアップ
よくわからんながらもがんばってみる。
メインは GitHubの abcjs/src/data/abc_tune.jsみたい。取りまとめ役?
cleanUp:下処理っぽい。速度指定表現を数値に、空行を削除、休符のみの小節、スラー、装飾音符、声部、行折返し
addElementToEvent:描画かなあ。よくわからんがコアっぽい。
makeVoicesArray:けっこう重要ポイント
abcjs/src/parse/以下の各ファイルで文字列処理している。メインは、abc_parse.js で、それをサポートする(下処理する)のが、abc_tokenizer.js って感じ。
繰り返し指定に従って演奏データに解釈するのが、abc_midi_sequencer.js。
parses a string representing ABC Music Notation into a usable internal structure.
var letter_to_bar: 小節の繰り返し指定を処理
varr letter_to_open_slur_and_triplets: スラーとか連符とか、複数音符に影響するあたりを処理
var addWords: 要素ごとに区切って配列addWordに入れていく? スラーや小節線を飛ばしたりしてる。word_listとは?
var addSymbols: 文字列をスペースあるいはダッシュで区切る。区切り文字はスペース、-(次の行に続く)、_(スラー)、*(次の行に続く)、|(小節線)、~(無視)。word_listに入れていく。next,slur,barなどと単語に置き換える。
var getBrokenRhythm: >や<(前後の音符の音長を+1/2、ー1/2する)
var getCoreNote: 音符を解釈していく部分。一番知りたいところ。1文字ずつ見ていく。
switch-case順番:①( スラー始まり、②) スラー終わり、③^ シャープ(ダブルシャープも)、④_ フラット(ダブルフラットも)、⑤= ナチュラル、⑥A-g 音高、⑦, オクターブ下げる、⑧' オクターブ上げる、⑨xyzZ 休符類、⑩1-0,/ 音長、⑪- スラー、⑫スペースやタブ 前の文字を見ていろいろ処理、⑬<> 前後の音長を調整、⑭デフォルト 終端処理?
parse line of music以下: メイン処理。
Ambiguous symbols: 状況によって解釈が変わる文字たち
Unambiguous symbols: 曖昧さのない文字たち(引用符内を除く)
小節線か音符グループかの判別が曖昧で大変。コードなのか音符なのかスラーか連符か小節線か?
tokenizes an ABC Music Notation string to support abc_parse.
getBarLine: 小節線、繰り返し指定を解釈。
小節線(繰り返し指定)の要素だったら、2〜最大5文字目まで見て、どんな種類の小節線(繰り返し指定)なのか判別して、len(要素の長さ)とtoken(種類)を返す
getPitchFromTokens: 音高を返す。中央Cは0。
getKeyAccidentals2、getKeyAccidental: 臨時記号の解釈
tokenize: token(ひとかたまりの文字)に分けて解釈していく。タイプはquote(引用符で囲まれた文字列)、alpha(はじめ?)、number(数字)、punct(区切り文字)。
getFraction: 音長部分を解釈。
スラッシュじゃなかったら数字。
スラッシュだったら次の文字を見ていく。
さらにスラッシュなら×1/2を繰り返す。
数字なら分数として解釈。
Turn parsed abc into a linear series of events.
noteEventsInBar: 小節の区切りで0にリセット。臨時記号用?
配列voiceの各要素elemの属性el_typeでswitch-caseしていく
noteだったら、休符やスペーサーじゃなければ配列voicesに加えていく。noteEventInBar++。
barだったら、3タイプ(startRepeat, endRepeat, startEnding)に分けて解釈。
endRepeat: 繰り返し範囲の右端。
startRepeat: 繰り返し範囲の左端と、繰り返し範囲の右端が再登場。繰り返し範囲のスタートフラグであるstartRepeatPlaceholderを設定。